﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Linq;
using System.Xml;

namespace CRM_WF
{
    class GestionXML
    {
        string fichier = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\bdd.xml";
        /**************************************************************
        * Auteur : Florian Cavallo
        * Nom Methode : RechercheXML()
        * Fonction : Recherche le champ désiré dans le fichier XML
        * Paramètre : string Descendants, string Element
        * Retour : chaine du résultat
        * ************************************************************/
        public string RechercheXML(string Descendants, string Element)
        {
            try
            {
                XDocument xmlDoc = XDocument.Load(fichier);

                var file = from Config in xmlDoc.Descendants(Descendants)
                           select new
                           {
                               result = Config.Element(Element).Value,
                           };

                foreach (var Config in file)
                {
                    return Config.result;
                }
                return null;
            }
            catch (FileNotFoundException)
            {
                return null;
            }
        }
        /**************************************************************
        * Auteur : Florian Cavallo
        * Nom Methode : RechercheXML()
        * Fonction : Recherche l'équivalent du nom recherché
        * Paramètre : string Descendants, string Element,string Attribut
        * Retour : chaine du résultat
        * ************************************************************/
        public string RechercheXML(string Element, string Valeur, string Attribut)
        {
            try
            {
                XDocument xmlDoc = XDocument.Load(fichier);
                var feeds = (from Config in xmlDoc.Descendants(Element)
                             where (Config.NextNode.ToString().Replace("\r\n", "").Trim()) == Valeur
                             select new
                             {
                                 result = Config.Attribute(Attribut).Value,
                             }).ToList();

                foreach (var a in feeds)
                {
                    return (string)a.result;
                }
                return null;
            }
            catch (FileNotFoundException)
            {
                return null;

            }
        }

        /**************************************************************
      * Auteur : Florian Cavallo
      * Nom Methode : VerifierIntegritee()
      * Fonction : Verifie que le fichier existe et contient bien toutes les balises utilisées
      * Paramètre : 
      * Retour : Booléen
      * ************************************************************/
        public bool VerifierIntegritee(List<string> Liste)
        {
            try
            {
                XDocument xmlDoc = XDocument.Load(fichier);
                bool valide = true;
                foreach (var elts in Liste)
                {
                    valide = valide && (from elt in xmlDoc.Descendants("Config")
                                        select elt.Descendants(elts).Any()
                              ).Single();
                }
                if (valide) return true;
            }
            catch (FileNotFoundException)
            {
                return false;
            }
            return false;
        }

        /**************************************************************
      * Auteur : Florian Cavallo
      * Nom Methode : EcrireConfig()
      * Fonction : Ecrit les options de configuration
      * Paramètre : Lieu de l'écriture + contenu
      * Retour : Booléen
      * ************************************************************/
        public bool EcrireConfig(string Element, string Valeur)
        {
            try
            {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(fichier);
                XmlElement root = xmlDoc.DocumentElement;
                XmlNode elt = root.SelectSingleNode(Element);
                elt.InnerText = Valeur;
                xmlDoc.Save(fichier);
            }
            catch (FileNotFoundException)
            {
                return false;
            }
            catch (NullReferenceException)
            {
                return false;
            }
            return true;
        }



        public IEnumerable<string> Ttlesbat(string Type)
        {
            //List<string> listrecup=null;
            XDocument xmlDoc;
            
            try
            {
                xmlDoc = XDocument.Load(fichier);

            }
            catch (FileNotFoundException)
            {
                yield break;
            }

               var  file = (from item in xmlDoc.Descendants(Type)
                            select new
                            {
                                id = (string)item.Element("id") ,
                                adresse = (string)item.Element("adresse").Value,
                                codepostal = (string)item.Element("codepostal"),
                                ville = (string)item.Element("ville").Value,
                                email = (string)item.Element("email").Value,
                                telephone = (string)item.Element("telephone")
                            }).ToList();

            foreach (var a in file)
            {
                yield return a.ToString();
            }
                yield break;
            

        }
    }
}
